Módulo
======

Um módulo é uma unidade de software independente que consiste de [modelos](/doc/guide/basics.model), [visões](/doc/guide/basics.view), [controles](/doc/guide/basics.controller) e outros componentes auxiliares. em muitos aspectos, um módulo lembra uma [aplicação](/doc/guide/basics.application). A principal diferença é que um módulo não pode ser implantado sozinho e ele deve residir em uma aplicação. Usuários podem acessar os controles em um m´dulo da mesma maneira que o fazem com controles normais de uma aplicação.

Módulos são úteis em vários cenários. Para uma aplicalção de grande escala, nós podemos dividí-la em vários módulos, cada um deles desenvolvido e mantido separadamente. Algumas funcionalidades comumente usadas, como o gerenciamento de usuários e o gerenciamento de comentário podem ser desenvolvidas em módulos para que elas possam ser facilmente reutilizadas em projetos futuros.


Criando um Módulo
-----------------

Um módulo é organizado como um diretório cujo nome serve como a sua [ID|CWebModule::id] única. A estrutura do diretório de um módulo é similar ao do [diretório base da aplicação](/doc/guide/basics.application#application-base-directory). Está apresentado abaixo o layout típico da estrutura do diretório de um módulo de nome `forum`:

~~~
forum/
   ForumModule.php            o arquivo de classe do módulo
   components/                contém os componentes reutilizáveis do usuário
      views/                  contém os arquivos de visão para os widgets
   controllers/               contém as classes dos controles
      DefaultController.php   o arquivo de classe do controle padrão
   extensions/                contém extensões de terceiros
   models/                    contém os arquivos de classe dos modelos
   views/                     contém as visões dos controles e os arquivos de layout
      layouts/                contém os arquivos das visões de layout
      default/                contém os arquivos das visões do controle padrão
         index.php            o arquivo da visão "index"
~~~

Um módulo deve ter uma classe de módulo que estende de [CWebModule]. O nome da classe é determinado usando a expressão `ucfirst($id).'Module'`, onde `$id` refere-se à ID do módulo (ou ao nome do diretório do módulo). Esta classe de módulo serve como o local central para o armazenamento de informações compartilhadas pelo código do módulo. Por exemplo, nós podemos usar [CWebModule::params] para armazenar os parâmetros do módulo, e usar [CWebModule::components] para compartilhar os [componentes da aplicação](/doc/guide/basics.application#application-component) no nível do módulo.

> Tip|Dica: Nó podemos usar o gerador de módulos do Gii para criar o esqueleto básico de um novo módulo.


Usando Módulos
--------------

Para usar um módulo, primeiro coloque o diretório do módulo sub o diretório `modules` do [diretório base da aplicação](/doc/guide/basics.application#application-base-directory). Então declare a ID do módulo na propriedade [modules|CWebApplication::modules] da aplicação. Por exemplo, para usar o módulo `forum` acima, nós podemos usar a seguinte [configuração de aplicação](/doc/guide/basics.application#application-configuration):

~~~
[php]
return array(
	......
	'modules'=>array('forum',...),
	......
);
~~~

Um módulo pode também ser configurado com valores iniciais para as suas propriedades. Isto é muito similar a configurar [componentes da aplicação](/doc/guide/basics.application#application-component). Por exemplo, o módulo `forum` pode ter uma propriedade chamada `postPerPage` na sua classe de módulo que pode ser configurada na [configuração da aplicação](/doc/guide/basics.application#application-configuration) como se segue:

~~~
[php]
return array(
	......
	'modules'=>array(
	    'forum'=>array(
	        'postPerPage'=>20,
	    ),
	),
	......
);
~~~

A instância do módulo pode ser acessada através da propriedade [module|CController::module] do controle atualmente ativo. Através da instância do módulo, nós podemos então acessar as informações que são compartilhadas no nível do módulo. Por exemplo, para acessar a informação em `postPerPage` acima, nós podemos usar a seguinte expressão:

~~~
[php]
$postPerPage=Yii::app()->controller->module->postPerPage;
// ou o seguinte se $this refere-se a uma instância de um controle
// $postPerPage=$this->module->postPerPage;
~~~

A ação de um controle em um módulo pode ser acessada usando a [rota](/doc/guide/basics.controller#route) `móduloID/controleID/açãoID`. Por exemplo, assumindo que o módulo `forum` acima tenha um controle chamado `PostController`, nós podemos usar a [rota](/doc/guide/basics.controller#route) `forum/post/create` para fazer referência à ação `create` neste controle. A URL correspondente a esta rota seria `http://www.example.com/index.php?r=forum/post/create`.

> Tip|Dica: Se um controle está em um subdiretório de `controllers`, nós ainda podemos usar o formato de [rota](/doc/guide/basics.controller#route) acima. Por exemplo. assumindo que `PostController` esteja sob `forum/controllers/admin`, nós podemos fazer uma referência à ação `create` usando `forum/admin/post/create`.


Módulo Aninhado
---------------

Módulos podem ser aninhados em níveis ilimitados. Isto quer dizer que um módulo pode conter outro módulo, que pode conter outro módulo, que pode conter ainda outro módulo. Nós podemos chamar o o primeiro deles de *módulo pai* e o último deles de *módulo folho*. Um módulo filho deve ser declarado na propriedade [modules|CWebModule::modules] do seu módulo pai, da mesma maneira que declaramos módulos na configuração da aplicação, como mostrado acima.

Para acessar uma ação de um controle em um módulo filho, nós podemos usar a rota `móduloPaiID/móduloFilhoID/controleID/açãoID`.


<div class="revision">$Id$</div>